package cn.arnold.linkedlist;

public class DoubleLinkedList {

    // 初始化一个头结点
    private DoubleHeroNode head = new DoubleHeroNode(0, "", "");

    /**
     * 遍历链表
     */
    public void showList() {
        // 校验链表是否为空
        if (head.getNext() == null) {
            System.out.println("链表为空...");
            return;
        }
        // 头节点不动----辅助节点
        DoubleHeroNode temp = head.getNext();
        // 循环遍历
        while (true) {
            if (temp == null) {  // 结束条件
                break;
            }
            // 输出节点信息
            System.out.println(temp);
            // temp指针后移
            temp = temp.getNext();
        }
    }

    /**
     * 添加节点：在尾部添加
     *
     * @param newHeroNode
     */
    public void add(DoubleHeroNode newHeroNode) {
        // 找到双向链表的最后一个节点--->`while循环，break条件：node.next=null`
        // 头节点不动----辅助节点
        DoubleHeroNode temp = head;
        while (true) {
            if (temp.getNext() == null) { // 找到最后一个节点
                break;
            }
            // 指针后移
            temp = temp.getNext();
        }
        // 在最后一个节点后面添加节点
        temp.setNext(newHeroNode);
        newHeroNode.setPre(temp);
    }

    /**
     * 修改节点
     *
     * @param heroNode
     */
    public void update(DoubleHeroNode heroNode) {
        // 根据编号找到待修改的节点---循环遍历
        DoubleHeroNode temp = head.getNext();
        boolean flag = false;
        while (true) {
            if (temp == null) { // 找到最后一个节点
                break;
            }
            if (temp.getNo() == heroNode.getNo()) {   // 找到待修改的节点
                flag = true;
                break;
            }
            // temp后移
            temp = temp.getNext();
        }
        // 修改
        if (flag) {
            temp.setName(heroNode.getName());
            temp.setNickname(heroNode.getNickname());
        } else {
            System.out.printf("没有找到 编号 %d 的节点，不能修改\n", heroNode.getNo());
        }
    }

    /**
     * 删除节点：根据编号
     *
     * @param no
     */
    public void delete(int no) {
        // 判断当前链表是否为空
        if (head.getNext() == null) {// 空链表
            System.out.println("链表为空，无法删除");
            return;
        }
        // 根据编号找到待删除的节点
        DoubleHeroNode temp = head.getNext();
        boolean flag = false;
        while (true) {
            if (temp == null) { // 找到最后一个节点
                break;
            }
            if (temp.getNo() == no) {   // 找到待修改的节点
                flag = true;
                break;
            }
            // temp后移
            temp = temp.getNext();
        }
        if (flag) {
            // 删除节点
            temp.getPre().setNext(temp.getNext());
            // 如果是最后一个节点，就不需要执行下面这句话，否则出现空指针
            if (temp.getNext() != null) {
                temp.getNext().setPre(temp.getPre());
            }
        } else {
            System.out.printf("要删除的 %d 节点不存在\n", no);
        }
    }
}
